#include "key.h"

Button board_button;      // 板载key PA0
Button key1;              // PB9
Button key2;              // PE1
Button key3;              // PC2
Button key4;              // PC0
Button key5;              // PD0
extern uint8_t menu_mode; // 菜单模式
extern uint8_t car_mode;  // 车辆模式
extern float base_speed;  // 基础速度
void btn0_single_click_handler(Button *btn)
{
    // printf("Button 1: Single Click\n");

    if (menu_mode == MENU_PAGE)
    {
        menu_mode = 0;
    }
    else
    {
        // printf("page change!\n");
        menu_mode++;
    }
}

void btn1_single_click_handler(Button *btn)
{
    // printf("Button 1: Double Click\n");
    // 增加量为0.1
    if (menu_mode == 1 && cursor_1 == 1)
    {
        PID_data_array[0][0] += 0.1f; // 增加Yaw_Kp
    }
    else if (menu_mode == 1 && cursor_1 == 2)
    {
        PID_data_array[0][1] += 0.1f; // 增加Yaw_Ki
    }
    else if (menu_mode == 1 && cursor_1 == 3)
    {
        PID_data_array[0][2] += 0.1f; // 增加Yaw_Kd
    }
    if (menu_mode == 1 && cursor_1 == 4)
    {
        // 增加GWkp
        PID_data_array[1][0] += 0.1f; // 增加GW_Kp
    }
    else if (menu_mode == 1 && cursor_1 == 5)
    {
        PID_data_array[1][1] += 0.1f; // 增加GW_Ki
    }
    else if (menu_mode == 1 && cursor_1 == 6)
    {
        PID_data_array[1][2] += 0.1f; // 增加GW_Kd
    }
    if (menu_mode == 1 && cursor_1 == 7)
    {
        // 增加基础速度
        base_speed += 10.0f; // 增加基础速度
    }
    if (menu_mode == 2 && cursor_2 == 3)
    {
        // 增加寻找色块的Kp
        PID_data_array[2][0] += 0.1f; // 增加Find_blobs_Kp
    }
    else if (menu_mode == 2 && cursor_2 == 4)
    {
        PID_data_array[2][1] += 0.1f; // 增加Find_blobs_Ki
    }
    else if (menu_mode == 2 && cursor_2 == 5)
    {
        PID_data_array[2][2] += 0.1f; // 增加Find_blobs_Kd
    }
    if (menu_mode == 3 && cursor_3 == 3)
    {
        // 增加前进到目标色块的Kp
        PID_data_array[3][0] += 0.1f; // 增加Go_Target_Kp
    }
    else if (menu_mode == 3 && cursor_3 == 4)
    {
        PID_data_array[3][1] += 0.1f; // 增加Go_Target_Ki
    }
    else if (menu_mode == 3 && cursor_3 == 5)
    {
        PID_data_array[3][2] += 0.1f; // 增加Go_Target_Kd
    }
    if (menu_mode == 4)
    {
        addx();
    }
}

void btn2_single_click_handler(Button *btn)
{
    // 减少量为0.1
    if (menu_mode == 1 && cursor_1 == 1)
    {
        PID_data_array[0][0] -= 0.1f; // 减少Yaw_Kp
    }
    else if (menu_mode == 1 && cursor_1 == 2)
    {
        PID_data_array[0][1] -= 0.1f; // 减少Yaw_Ki
    }
    else if (menu_mode == 1 && cursor_1 == 3)
    {
        PID_data_array[0][2] -= 0.1f; // 减少Yaw_Kd
    }
    if (menu_mode == 1 && cursor_1 == 4)
    {
        // 减少GWkp
        PID_data_array[1][0] -= 0.1f; // 减少GW_Kp
    }
    else if (menu_mode == 1 && cursor_1 == 5)
    {
        PID_data_array[1][1] -= 0.1f; // 减少GW_Ki
    }
    else if (menu_mode == 1 && cursor_1 == 6)
    {
        PID_data_array[1][2] -= 0.1f; // 减少GW_Kd
    }
    if (menu_mode == 1 && cursor_1 == 7)
    {
        // 减少基础速度
        base_speed -= 10.0f; // 减少基础速度
    }
    if (menu_mode == 2 && cursor_2 == 3)
    {
        // 减少寻找色块的Kp
        PID_data_array[2][0] -= 0.1f; // 减少Find_blobs_Kp
    }
    else if (menu_mode == 2 && cursor_2 == 4)
    {
        PID_data_array[2][1] -= 0.1f; // 减少Find_blobs_Ki
    }
    else if (menu_mode == 2 && cursor_2 == 5)
    {
        PID_data_array[2][2] -= 0.1f; // 减少Find_blobs_Kd
    }
    if (menu_mode == 3 && cursor_3 == 3)
    {
        // 减少前进到目标色块的Kp
        PID_data_array[3][0] -= 0.1f; // 减少Go_Target_Kp
    }
    else if (menu_mode == 3 && cursor_3 == 4)
    {
        PID_data_array[3][1] -= 0.1f; // 减少Go_Target_Ki
    }
    else if (menu_mode == 3 && cursor_3 == 5)
    {
        PID_data_array[3][2] -= 0.1f; // 减少Go_Target_Kd
    }
    if (menu_mode == 4)
    {
        deductx();
    }
}
void btn3_single_click_handler(Button *btn)
{
    // printf("Button 3: Single Click\n");
    if (menu_mode == 4)
    {
        addy();
    }
}
void btn4_single_click_handler(Button *btn) // carmode转换
{
    if (car_mode == 0 && menu_mode == 0)
    {
        car_mode = 1; // 题目开始运行
    }
    else if (car_mode == 1 && menu_mode == 0)
    {
        car_mode = 0; // 题目停止运行
    }
    // printf("Button 4: Single Click\n");
    if (menu_mode == 4)
    {
        deducty();
    }
}
void btn5_single_click_handler(Button *btn)
{
    // printf("Button 5: Single Click\n");
    // 更改OLED各个界面的光标位置
    if (menu_mode == 0)
    {
        cursor_0++;
        if (cursor_0 == MENU0_CURSORMAX)
            cursor_0 = 0; // 循环
    }
    else if (menu_mode == 1)
    {
        cursor_1++;
        if (cursor_1 >= MENU1_CURSORMAX)
            cursor_1 = 1; // 循环
    }
    else if (menu_mode == 2)
    {
        cursor_2++;
        if (cursor_2 >= 6)
            cursor_2 = 3; // 2,3,4循环
    }
    else if (menu_mode == 3)
    {
        cursor_3++;
        if (cursor_3 >= 6)
            cursor_3 = 3; // 循环
    }
    else if (menu_mode == 4)
    {
        Stepper_AllStop(); // 停止所有步进电机
        buzzer_beep(1, 100, 100); // 蜂鸣器响
    }

}
void btn5_double_click_handler(Button *btn)
{
    if (menu_mode != 4)
    {
        W25QXX_SavePIDData();
        buzzer_beep(1, 100, 100);
    }

    
}

void key_init(void)
{
    // Initialize board button
    button_init(&board_button, read_button_gpio, 1, 0); // PA0 板载按键
    button_attach(&board_button, BTN_SINGLE_CLICK, btn0_single_click_handler);
    button_start(&board_button);

    button_init(&key1, read_button_gpio, 0, 1); // PB9
    button_attach(&key1, BTN_SINGLE_CLICK, btn1_single_click_handler);
    button_start(&key1);

    button_init(&key2, read_button_gpio, 0, 2); // PE1
    button_attach(&key2, BTN_SINGLE_CLICK, btn2_single_click_handler);
    button_start(&key2);

    button_init(&key3, read_button_gpio, 0, 3); // PC2
    button_attach(&key3, BTN_SINGLE_CLICK, btn3_single_click_handler);
    button_start(&key3);

    button_init(&key4, read_button_gpio, 0, 4); // PC0
    button_attach(&key4, BTN_SINGLE_CLICK, btn4_single_click_handler);
    button_start(&key4);

    button_init(&key5, read_button_gpio, 0, 5); // PD0
    button_attach(&key5, BTN_SINGLE_CLICK, btn5_single_click_handler);
    button_attach(&key5, BTN_DOUBLE_CLICK, btn5_double_click_handler);
    button_start(&key5);
}
